{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center> <h1>Perturbation Analysis </h1> </center>\n",
    "\n",
    "&nbsp;\n",
    "\n",
    "&nbsp;\n",
    "\n",
    "In this notebook, we investigate the  ability of the **GraphWave** algorithm to detect structural similarities, as well as its robustness to small perturbations. We propose an analysis of the accuracy of the recovery of the different topological roles based on simulations on toy graphs, so that we benefit from an actual ground-truth to benchmark the different results. For convenience purposes, this notebook contains code for running the \"perturbed\" experiments provided in the associated paper. We have tested here \"small pertubations\" (we randomly add a few edges to the structure, so as to  maintain the patterns (this is why we did not delete edges as well), but shattering the symmetry of the system that yielded structural equivalents. For simulations with a higher noise level, we refer the reader to Notebook Synthetic Experiments--structures.\n",
    "\n",
    "The setup of the experiment is the following:\n",
    "\n",
    "1. We begin by creating a toy graph (that is, a regular structure with repetitions of identical patterns at different areas of the graph). Each type of structural role (that is, bottom corner in the house shape, middle of the center ring, etc.) is endowed with a particular label.\n",
    "2. __Optional__: to simulate the effect of small perturbations, we artificially remove and add a few edges on the graph\n",
    "3. We compute the structural representations given by our method\n",
    "4. To assess the relevance of our results, we propose to evaluate our method using 3 different criteria:\n",
    "    + We project these representations in 2D using PCA: the idea is to try to assess visually the proximity of the different featurization. In the different plots,\n",
    "    + We also plug-in these representations as input into a clustering algorithm (default: kmeans), and assess the purity of the clusters that are recovered using k-means. This gives us an indicator of the relevance of our embeddings if the goal was to recover $K$ distinct classes of structural equivalents.\n",
    "\n",
    "\n",
    "First of all, to provide a little bit of intuition and to explain some of the follwoing results, we note that RoleX is specifically designed for clustering role similarities, whereas struc2vec and GraphWave aim to find similarities across a spectrum of roles (hence the distance between nodes is more meaningful in the later than in the case of RoleX), which does not guarantee to provide comparisons across classes. Hence, since we propose to assess the performance via clustering, RoleX should perform better --it was designed specifically for this purpose."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## I. Loading the modules and creating the graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "#### Tests like paper\n",
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx \n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import pickle\n",
    "import seaborn as sb\n",
    "import sklearn as sk\n",
    "from sklearn.cluster import KMeans\n",
    "from sklearn.manifold import TSNE\n",
    "import sys\n",
    "\n",
    "sys.path.append('../')\n",
    "import graphwave as gw\n",
    "from shapes.shapes import *\n",
    "from shapes.build_graph import *\n",
    "from distances.distances_signature import *\n",
    "from characteristic_functions import *\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 1- Start by defining our favorite regular structure\n",
    "\n",
    "width_basis = 15\n",
    "nbTrials = 20\n",
    "\n",
    "\n",
    "################################### EXAMPLE TO BUILD A SIMPLE REGULAR STRUCTURE ##########\n",
    "## REGULAR STRUCTURE: the most simple structure:  basis + n small patterns of a single type\n",
    "\n",
    "### 1. Choose the basis (cycle, torus or chain)\n",
    "basis_type = \"cycle\" \n",
    "\n",
    "### 2. Add the shapes \n",
    "nb_shapes = 5  ## numbers of shapes to add \n",
    "#shape = [\"fan\",6] ## shapes and their associated required parameters  (nb of edges for the star, etc)\n",
    "#shape = [\"star\",6]\n",
    "list_shapes = [[\"house\"]] * nb_shapes\n",
    "\n",
    "### 3. Give a name to the graph\n",
    "identifier = 'AA'  ## just a name to distinguish between different trials\n",
    "name_graph = 'houses' + identifier\n",
    "sb.set_style('white')\n",
    "\n",
    "### 4. Pass all these parameters to the Graph Structure\n",
    "add_edges = 4 ## nb of edges to add anywhere in the structure\n",
    "del_edges  =0\n",
    "\n",
    "G, communities, plugins, role_id = build_structure(width_basis, basis_type, list_shapes, start=0,\n",
    "                            rdm_basis_plugins =False, add_random_edges=0,\n",
    "                            plot=False, savefig=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nb of nodes in the graph:  40\n",
      "nb of edges in the graph:  60\n"
     ]
    }
   ],
   "source": [
    "print 'nb of nodes in the graph: ', G.number_of_nodes()\n",
    "print 'nb of edges in the graph: ', G.number_of_edges()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Start the analysis!!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this first set of experiments, we look at the performance of the algorithms when 3 edges are randomly added to the structure. This provides a \"small perturbation\", since the Jaccard distance between the adjacency matrices of the two graphs is:\n",
    "$$ d_{HAmming}(A, \\tilde{A})=\\frac{||A -\\tilde{A}||_2}{||A +\\tilde{A}||_*}=\\frac{6}{63*2}=0.048$$\n",
    "\n",
    "We iterate the experiment 20 times, and average over the performance score to finally be able to compare the algorithms. \n",
    "\n",
    "We have included the results of this experiments in the cache folder, which the reader can either download or run again.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from graphwave import graphwave_alg\n",
    "chi,heat_print, taus = graphwave_alg(G, np.linspace(0,100,25), taus=range(19,21), verbose=True)\n",
    "mapping_inv={i: taus[i] for i in range(len(taus))}\n",
    "mapping={float(v): k for k,v in mapping_inv.iteritems()}\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11b94fb90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.cluster import KMeans\n",
    "\n",
    "colors = role_id\n",
    "nb_clust = len(np.unique(colors))\n",
    "pca = PCA(n_components=5)\n",
    "\n",
    "trans_data = pca.fit_transform(StandardScaler().fit_transform(chi))\n",
    "km = sk.cluster.KMeans(n_clusters=nb_clust)\n",
    "km.fit(trans_data)\n",
    "labels_pred = km.labels_\n",
    "######## Params for plotting\n",
    "cmapx = plt.get_cmap('rainbow')\n",
    "x = np.linspace(0,1,np.max(labels_pred) + 1)\n",
    "col = [cmapx(xx) for xx in x ]\n",
    "markers = {0:'*',1: '.', 2:',',3: 'o',4: 'v',5: '^',6: '<',7: '>',8: 3 ,\\\n",
    "           9:'d',10: '+',11:'x',12:'D',13: '|',14: '_',15:4,16:0,17:1,\\\n",
    "           18:2,19:6,20:7}\n",
    "########\n",
    "\n",
    "for c in np.unique(colors):\n",
    "        indc = [i for i, x in enumerate(colors) if x == c]\n",
    "        #print indc\n",
    "        plt.scatter(trans_data[indc, 0], trans_data[indc, 1],\n",
    "                    c=np.array(col)[list(np.array(labels_pred)[indc])],\n",
    "                    marker=markers[c%len(markers)], s=500)\n",
    "labels = colors\n",
    "for label,c, x, y in zip(labels,labels_pred, trans_data[:, 0], trans_data[:, 1]):\n",
    "            plt.annotate(label,xy=(x, y), xytext=(0, 0), textcoords='offset points')\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Homogeneity \t Completeness \t AMI \t nb clusters \t CH \t  Silhouette \n",
      "\n",
      "1.0\t1.0\t1.0\t6\t2.42231869615e+31\t0.999999995194\n"
     ]
    }
   ],
   "source": [
    "ami=sk.metrics.adjusted_mutual_info_score(colors, labels_pred)  \n",
    "sil=sk.metrics.silhouette_score(trans_data,labels_pred, metric='euclidean')\n",
    "ch=sk.metrics.calinski_harabaz_score(trans_data, labels_pred)\n",
    "hom=sk.metrics.homogeneity_score(colors, labels_pred) \n",
    "comp=sk.metrics.completeness_score(colors, labels_pred)\n",
    "print 'Homogeneity \\t Completeness \\t AMI \\t nb clusters \\t CH \\t  Silhouette \\n'\n",
    "print str(hom)+'\\t'+str(comp)+'\\t'+str(ami)+'\\t'+str(nb_clust)+'\\t'+str(ch)+'\\t'+str(sil)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## II. Varied shapes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "24 25\n",
      "16 10\n",
      "117 129\n",
      "70 59\n",
      "57 100\n",
      "120 44\n",
      "0 87\n",
      "114 112\n",
      "132 106\n",
      "52 126\n"
     ]
    }
   ],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "################################### EXAMPLE TO BUILD A MORE COMPLICATED STRUCTURE ##########\n",
    "######### Alternatively, to define a structure with different types of patterns, pass them as a list\n",
    "######### In the following example, we have 3 fans (with param. 6), 3 stars on 4 nodes, and 3 house shapes\n",
    "name_graph='regular'\n",
    "from sklearn import preprocessing\n",
    "width_basis=25\n",
    "add_edges=10\n",
    "list_shapes=[[\"fan\",6]]*5+[[\"star\",10]]*5+[[\"house\"]]*5 \n",
    "G,colors_shape, plugins,colors=build_structure(width_basis,basis_type,list_shapes, start=0,add_random_edges=add_edges,plot=False,savefig=False)\n",
    "nb_clust=len(np.unique(colors))\n",
    "chi,heat_print, taus = graphwave_alg(G, np.linspace(0,100,25), taus='auto', verbose=True)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Homogeneity \t Completeness \t AMI \t nb clusters \t CH \t  Silhouette \n",
      "\n",
      "0.807225127328\t0.822548446455\t0.749729344022\t14\t328.96100831\t0.616093758945\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAr0gCEI59/+A5qcPHGOQmgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11e591590>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pca=PCA(n_components=5)\n",
    "trans_data=pca.fit_transform(StandardScaler().fit_transform(chi))\n",
    "km=sk.cluster.KMeans(n_clusters=nb_clust)\n",
    "km.fit(trans_data)\n",
    "labels_pred=km.labels_\n",
    "######## Params for plotting\n",
    "cmapx=plt.get_cmap('rainbow')\n",
    "x=np.linspace(0,1,np.max(labels_pred)+1)\n",
    "col=[cmapx(xx) for xx in x ]\n",
    "markers = {0:'*',1: '.', 2:',',3: 'o',4: 'v',5: '^',6: '<',7: '>',8: 3 ,9:'d',10: '+',11:'x',12:'D',13: '|',14: '_',15:4,16:0,17:1,18:2,19:6,20:7}\n",
    "########\n",
    "\n",
    "for c in np.unique(colors):\n",
    "        indc=[i for i,x in enumerate(colors) if x==c]\n",
    "        #print indc\n",
    "        plt.scatter(trans_data[indc,0], trans_data[indc,1],c=np.array(col)[list(np.array(labels_pred)[indc])] ,marker=markers[c%len(markers)],s=500)\n",
    "labels = colors\n",
    "for label,c, x, y in zip(labels,labels_pred, trans_data[:, 0], trans_data[:, 1]):\n",
    "            plt.annotate(label,xy=(x, y), xytext=(0, 0), textcoords='offset points')\n",
    "            \n",
    "\n",
    "ami=sk.metrics.adjusted_mutual_info_score(colors, labels_pred)  \n",
    "sil=sk.metrics.silhouette_score(trans_data,labels_pred, metric='euclidean')\n",
    "ch=sk.metrics.calinski_harabaz_score(trans_data, labels_pred)\n",
    "hom=sk.metrics.homogeneity_score(colors, labels_pred) \n",
    "comp=sk.metrics.completeness_score(colors, labels_pred)\n",
    "print 'Homogeneity \\t Completeness \\t AMI \\t nb clusters \\t CH \\t  Silhouette \\n'\n",
    "print str(hom)+'\\t'+str(comp)+'\\t'+str(ami)+'\\t'+str(nb_clust)+'\\t'+str(ch)+'\\t'+str(sil)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
